package com.xjk.file;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.util.Base64;
import javax.imageio.ImageIO;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import sun.net.www.content.image.png;

/**
 * @author xjk
 * @date 2024-11-14
 */
public class PdfToPngUtil {

  /**
   * 主函数，用于将PDF文件转换为PNG图片并输出到指定路径，同时将图片转换为Base64编码并打印。
   */
  public static void main(String[] args) {
      // 在线 PDF 文件的 URL
      String pdfFileUrl = "https://bztic-gs-files-sit.oss-cn-shanghai.aliyuncs.com/uat/OMS4-UAT/20241128/923497461/241128185436_3a9d.pdf"; // 替换为你的 PDF URL
      // 输出 PNG 文件的路径
      String outputPath = "D:\\Desktop\\";

      try {
          // 从 URL 下载 PDF 文件到本地
          File pdfFile = downloadPdfFromUrl(pdfFileUrl);

          // 将 PDF 文件转换为 PNG 图片
          BufferedImage pngImage = convertPdfToPng(pdfFile, outputPath);

          // 将 PNG 图片转换为 Base64 编码并打印
          String base64EncodedPng = convertImageToBase64(pngImage, "png");
          System.out.println(base64EncodedPng);

          // 打印完成信息
          System.out.println("PDF 转换为 PNG 完成。");
      } catch (IOException e) {
          e.printStackTrace();
      }
  }

  /**
   * 从给定的 URL 下载 PDF 文件到本地并返回文件对象。
   *
   * @param pdfUrl PDF 文件的 URL
   * @return 下载后的 PDF 文件对象
   * @throws IOException 如果下载过程中发生 IO 异常
   */
  private static File downloadPdfFromUrl(String pdfUrl) throws IOException {
      // URL url = new URL(pdfUrl);
      // InputStream inputStream = url.openStream();
      // File tempFile = Files.createTempFile("pdf_temp", ".pdf").toFile();
      // Files.copy(inputStream, tempFile.toPath());
      // inputStream.close();

      // 示例中直接使用了本地文件，如果需要从 URL 下载，请取消注释以上代码并注释下一行
      return new File("D:\\Desktop\\241108145328_f21e.pdf");
  }

  /**
   * 将 PDF 文件转换为 PNG 图片并保存到指定路径。
   *
   * @param pdfFile  要转换的 PDF 文件
   * @param outputPath 输出 PNG 图片的路径
   * @return 转换后的 PNG 图片的 BufferedImage 对象
   * @throws IOException 如果转换过程中发生 IO 异常
   */
  private static BufferedImage convertPdfToPng(File pdfFile, String outputPath) throws IOException {
      try (PDDocument document = PDDocument.load(pdfFile)) {
          PDFRenderer pdfRenderer = new PDFRenderer(document);
          int totalPages = document.getNumberOfPages();

          for (int i = 0; i < totalPages; i++) {
              BufferedImage bim = pdfRenderer.renderImageWithDPI(i, 500); // 300 DPI
              ImageIO.write(bim, "PNG", new File(outputPath + "page_" + (i + 1) + ".png"));
          }

          // 如果只需要最后一页，可以只处理最后一页
          BufferedImage lastPageImage = pdfRenderer.renderImageWithDPI(totalPages - 1, 500);
          return lastPageImage;
      }
  }

  /**
   * 将图片转换为 Base64 编码的字符串。
   *
   * @param image    要转换的图片的 BufferedImage 对象
   * @param format   图片格式（如 "png", "jpg" 等）
   * @return 图片的 Base64 编码字符串
   * @throws IOException 如果转换过程中发生 IO 异常
   */
  private static String convertImageToBase64(BufferedImage image, String format) throws IOException {
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      ImageIO.write(image, format, baos);
      byte[] imageBytes = baos.toByteArray();
      return Base64.getEncoder().encodeToString(imageBytes);
  }




}
